package concurrente.filosofos;

import java.lang.*;
import java.util.Random;

public class Filosofo extends Thread {

  private int identificativo;
  private Tenedor izquierda;
  private Tenedor derecha;
  private Random random;
  private boolean izquierdatomado;
  private boolean derechatomado;
  private int elegido;
  private boolean flag;

  Filosofo(int identificativo_, Tenedor izquierda_, Tenedor derecha_) 
  {
    identificativo=identificativo_;
    izquierda=izquierda_;
    derecha=derecha_;
    random = new Random();
  }

  public void pensar()
  {
   try
   {
      this.sleep(10000);
   }catch(InterruptedException ie) 
   {
   }
  }

  public void comer()
  {
   try
   {
       System.out.println("comiendo...");
       System.out.println(identificativo);
       this.sleep(10000);
       System.out.println("terminando de comer...");
       System.out.println(identificativo);

   }catch(InterruptedException ie)
   {
   }
  }

  public void run()
  {
   while(true)
   {
      this.pensar();
  
      flag=false;

      elegido=random.nextInt(2);

      if(elegido==0)
      {
	  if(!izquierda.esocupado())
	  {
	      izquierda.tomar();
	      izquierdatomado=true;
	  }
	   else if(!derecha.esocupado())
	   	  {
	   	      derecha.tomar();
	   	      derechatomado=true;
	  	  }
      }
      else if(elegido==1)
      {
	  if(!derecha.esocupado())
	  {
	      derecha.tomar();
	      derechatomado=true;
	  }
	  	  else if(!izquierda.esocupado())
	   	  {
	  	      izquierda.tomar();
	       	      izquierdatomado=true;
	          }
      }
      
      if(izquierdatomado==true)
      {
	  if(!derecha.esocupado())
	  {
	      derecha.tomar();
	      derechatomado=true;
	      flag=true;
	  }
	   else
	   {
	      izquierda.soltar();
	      izquierdatomado=false;
	   }
      }

      if(derechatomado==true && !flag)
      {
	  if(!izquierda.esocupado())
	  {
	      izquierda.tomar();
	      izquierdatomado=true;
	  }
          else
	  {
	      derecha.soltar();
	      derechatomado=false;
	  }
      }
      
      if(derechatomado && izquierdatomado)
      {
	  this.comer();
	  
	  elegido=random.nextInt(2);

	  if(elegido==0)
	  {
	      izquierda.soltar();
	      izquierdatomado=false;
	      derecha.soltar();
	      derechatomado=false;
	  }
	  else
	  {
	      derecha.soltar();
	      derechatomado=false;
	      izquierda.soltar();
	      izquierdatomado=false;
	  }
      }
   }
  }      
}
